﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using BusinessObjects;

namespace DataAccess.SqlServer
{
    public class SqlServerNhanVien: INhanVien
    {
        public NhanVien GetNhanVien(int oid)
        {
            string sql = @" Select b.MaQuanLy, b.Ho, b.Ten, b.GioiTinh, b.NgaySinh, b.BoPhan, b.NoiSinh, b.QueQuan, b.DiaChiThuongTru,
                                    b.NoiOHienNay, b.DienThoaiDiDong, b.DienThoaiCoQuan, b.Email, b.HopDong, b.TinhTrang, b.GhiChu,
                                    a.BienChe, a.LoaiNhanVien, a.ChucVu, a.NgayBoNhiem, a.LanBoNhiem
                            From NhanVien a inner join HoSo b on a.Oid = b.Oid
                            Where a.Oid = @oid";
            
            SqlParameter param = new SqlParameter("@oid", oid);
            DataRow row = DataProvider.GetDataRow(sql, param);

            NhanVien nhanVien = new NhanVien();

            nhanVien.Oid = oid;
            nhanVien.MaQuanLy = row["MaQuanLy"].ToString();
            nhanVien.Ho = row["Ho"].ToString();
            nhanVien.Ten = row["Ten"].ToString();
            byte gioiTinh;
            if (byte.TryParse(row["GioiTinh"].ToString(), out gioiTinh))
                nhanVien.GioiTinh = (EGioiTinh)gioiTinh;
            DateTime ngaySinh;
            if (DateTime.TryParse(row["NgaySinh"].ToString(), out ngaySinh))
                nhanVien.NgaySinh = ngaySinh;
            int id;
            if (int.TryParse(row["BoPhan"].ToString(), out id))
            {
                SqlServerBoPhan sqlBoPhan = new SqlServerBoPhan();
                nhanVien.BoPhan = sqlBoPhan.GetBoPhan(id);
            }
            nhanVien.NoiSinh = row["NoiSinh"].ToString();
            nhanVien.QueQuan = row["QueQuan"].ToString();
            nhanVien.DiaChiThuongTru = row["DiaChiThuongTru"].ToString();
            nhanVien.NoiOHienNay = row["NoiOHienNay"].ToString();
            nhanVien.DienThoaiDiDong = row["DienThoaiDiDong"].ToString();
            nhanVien.DienThoaiCoQuan = row["DienThoaiCoQuan"].ToString();
            nhanVien.Email = row["Email"].ToString();
            
            if (int.TryParse(row["HopDong"].ToString(), out id))
            {
                //SqlServerHopDongNhanVien hopDongNhanVien = new SqlServerHopDongNhanVien();
                nhanVien.HopDong = HopDongFactory.GetHopDong(id);
            }
            if (int.TryParse(row["TinhTrang"].ToString(), out id))
            {
                SqlServerTinhTrang sqlServerTinhTrang = new SqlServerTinhTrang();
                nhanVien.TinhTrang = sqlServerTinhTrang.GetTinhTrang(id);
            }
            nhanVien.GhiChu = row["GhiChu"].ToString();

            return nhanVien;
        }

        public List<NhanVien> GetListNhanVien()
        {
            string sql = @" Select b.Oid, b.MaQuanLy, b.Ho, b.Ten, b.GioiTinh, b.NgaySinh, b.BoPhan, b.NoiSinh, b.QueQuan, b.DiaChiThuongTru,
                                    b.NoiOHienNay, b.DienThoaiDiDong, b.DienThoaiCoQuan, b.Email, b.HopDong, b.TinhTrang, b.GhiChu,
                                    a.BienChe, a.LoaiNhanVien, a.ChucVu, a.NgayBoNhiem, a.LanBoNhiem
                            From NhanVien a inner join HoSo b on a.Oid = b.Oid";

            DataTable dt = DataProvider.GetDataTable(sql);
            
            return GetListNhanVien(dt);
        }
        public List<NhanVien> GetListNhanVien(BoPhan boPhan)
        {
            string sql = @" Select b.Oid, b.MaQuanLy, b.Ho, b.Ten, b.GioiTinh, b.NgaySinh, b.BoPhan, b.NoiSinh, b.QueQuan, b.DiaChiThuongTru,
                                    b.NoiOHienNay, b.DienThoaiDiDong, b.DienThoaiCoQuan, b.Email, b.HopDong, b.TinhTrang, b.GhiChu,
                                    a.BienChe, a.LoaiNhanVien, a.ChucVu, a.NgayBoNhiem, a.LanBoNhiem
                            From NhanVien a inner join HoSo b on a.Oid = b.Oid
                            Where BoPhan = @BoPhan";

            SqlParameter param = new SqlParameter("@BoPhan", boPhan.Oid);
            DataTable dt = DataProvider.GetDataTable(sql, param);
            return GetListNhanVien(dt);
        }

        private List<NhanVien> GetListNhanVien(DataTable dt)
        {
            List<NhanVien> list = new List<NhanVien>();

            foreach (DataRow row in dt.Rows)
            {
                NhanVien nhanVien = new NhanVien();

                nhanVien.Oid = int.Parse(row["Oid"].ToString());
                nhanVien.MaQuanLy = row["MaQuanLy"].ToString();
                nhanVien.Ho = row["Ho"].ToString();
                nhanVien.Ten = row["Ten"].ToString();
                byte gioiTinh;
                if (byte.TryParse(row["GioiTinh"].ToString(), out gioiTinh))
                    nhanVien.GioiTinh = (EGioiTinh)gioiTinh;
                DateTime ngay;
                if (DateTime.TryParse(row["NgaySinh"].ToString(), out ngay))
                    nhanVien.NgaySinh = ngay;
                int id;
                if (int.TryParse(row["BoPhan"].ToString(), out id))
                {
                    SqlServerBoPhan sqlBoPhan = new SqlServerBoPhan();
                    nhanVien.BoPhan = sqlBoPhan.GetBoPhan(id);
                }
                nhanVien.NoiSinh = row["NoiSinh"].ToString();
                nhanVien.QueQuan = row["QueQuan"].ToString();
                nhanVien.DiaChiThuongTru = row["DiaChiThuongTru"].ToString();
                nhanVien.NoiOHienNay = row["NoiOHienNay"].ToString();
                nhanVien.DienThoaiDiDong = row["DienThoaiDiDong"].ToString();
                nhanVien.DienThoaiCoQuan = row["DienThoaiCoQuan"].ToString();
                nhanVien.Email = row["Email"].ToString();

                if (int.TryParse(row["HopDong"].ToString(), out id))
                {
                    //SqlServerHopDongNhanVien hopDongNhanVien = new SqlServerHopDongNhanVien();
                    HopDong hopDong = new HopDong();
                    hopDong = HopDongFactory.GetHopDong(id);
                    if (HopDongFactory.GetHopDong(id) != null)
                    {
                        nhanVien.HopDong = hopDong;
                    }
                    else
                        nhanVien.HopDong = null;
                }
                if (int.TryParse(row["TinhTrang"].ToString(), out id))
                {
                    SqlServerTinhTrang sqlServerTinhTrang = new SqlServerTinhTrang();
                    nhanVien.TinhTrang = sqlServerTinhTrang.GetTinhTrang(id);
                }
                nhanVien.GhiChu = row["GhiChu"].ToString();
                nhanVien.BienChe = bool.Parse(row["BienChe"].ToString());
                if (int.TryParse(row["LoaiNhanVien"].ToString(), out id))
                {
                    SqlServerLoaiNhanVien sqlServerLoaiNhanVien = new SqlServerLoaiNhanVien();
                    nhanVien.LoaiNhanVien = sqlServerLoaiNhanVien.GetLoaiNhanVien(id);
                }
                if (int.TryParse(row["ChucVu"].ToString(), out id))
                {
                    SqlServerChucVu sqlServerChucVu = new SqlServerChucVu();
                    nhanVien.ChucVu = sqlServerChucVu.GetChucVu(id);
                }
                if (DateTime.TryParse(row["NgayBoNhiem"].ToString(), out ngay))
                {
                    nhanVien.NgayBoNhiem = ngay;
                }
                byte lanBoNhiem;
                if (byte.TryParse(row["LanBoNhiem"].ToString(), out lanBoNhiem))
                    nhanVien.LanBoNhiem = lanBoNhiem;

                list.Add(nhanVien);
            }
            return list;

        }


        public int Insert(NhanVien nhanVien)
        {
            SqlServerHoSo hoSo = new SqlServerHoSo();

            int oid = hoSo.Insert((HoSo)nhanVien);
            if (oid > 0)
            {
//                string sql = @" Insert into NhanVien(Oid, BienChe, LoaiNhanVien, ChucVu, NgayBoNhiem, LanBoNhiem)
//                                Values(@Oid, @BienChe, @LoaiNhanVien, @ChucVu, @NgayBoNhiem, @LanBoNhiem)";
                string sql = @" Insert into NhanVien(Oid, BienChe, LoaiNhanVien, ChucVu, NgayBoNhiem, LanBoNhiem)
                                Values(@Oid, @BienChe, @LoaiNhanVien, @ChucVu, @NgayBoNhiem, @LanBoNhiem)";
                SqlParameter[] param = {
                                           new SqlParameter("@Oid", oid),
                                           new SqlParameter("@BienChe", nhanVien.BienChe),
                                           new SqlParameter("@LoaiNhanVien", nhanVien.LoaiNhanVien.Oid),
                                           new SqlParameter("@ChucVu", nhanVien.ChucVu.Oid),
                                           new SqlParameter("@NgayBoNhiem", nhanVien.NgayBoNhiem),
                                           new SqlParameter("@LanBoNhiem", nhanVien.LanBoNhiem)
                                       };
                /*
                if (nhanVien.LoaiNhanVien != null)
                    param[2].Value = nhanVien.LoaiNhanVien.Oid;
                    //param[2].Value = nhanVien.LoaiNhanVien.Oid;
                else
                    param[2].Value = DBNull.Value;
                    //param[2].Value = DBNull.Value;
                */
                DataProvider.Insert(sql, param);
                    ThamChieuDuLieu thamChieuDuLieu = new ThamChieuDuLieu();
                    thamChieuDuLieu.Cha = new SqlServerKieuDuLieu().GetKieuDuLieu(typeof(HoSo).ToString());
                    thamChieuDuLieu.Con = new SqlServerKieuDuLieu().GetKieuDuLieu(typeof(NhanVien).ToString());
                    thamChieuDuLieu.GiaTri = oid;
                    SqlServerThamChieuDuLieu sqlServerThamChieuDuLieu = new SqlServerThamChieuDuLieu();
                    sqlServerThamChieuDuLieu.Insert(thamChieuDuLieu);
            }

            nhanVien.Oid = oid;
            return oid;
        }

        public int Update(NhanVien nhanVien)
        {
            SqlServerHoSo hoSo = new SqlServerHoSo();

            int temp = hoSo.Update((HoSo)nhanVien);
            if (temp > 0)
            {
                string sql = @" Update NhanVien
                                Set BienChe= @BienChe, 
                                    LoaiNhanVien = @LoaiNhanVien, 
                                    ChucVu = @ChucVu, 
                                    NgayBoNhiem = @NgayBoNhiem, 
                                    LanBoNhiem = @LanBoNhiem
                                Where Oid = @Oid";
                SqlParameter[] param = {
                                           new SqlParameter("@Oid", nhanVien.Oid),
                                           new SqlParameter("@BienChe", nhanVien.BienChe),
                                           new SqlParameter("@LoaiNhanVien", nhanVien.LoaiNhanVien.Oid),
                                           new SqlParameter("@ChucVu", nhanVien.ChucVu.Oid),
                                           new SqlParameter("@NgayBoNhiem", nhanVien.NgayBoNhiem),
                                           new SqlParameter("@LanBoNhiem", nhanVien.LanBoNhiem)
                                       };

                temp = DataProvider.Update(sql, param);
            }
            return temp;
        }

        public int Delete(NhanVien nhanVien)
        {
            string sql = @" Delete From NhanVien Where Oid = @Oid";
            SqlParameter param = new SqlParameter("@Oid", nhanVien.Oid);

            int temp = DataProvider.Update(sql, param);
            if (temp > 0)
            {
                SqlServerHoSo sqlServerHoSo = new SqlServerHoSo();
                temp = sqlServerHoSo.Delete((HoSo)nhanVien);

                if (temp > 0)
                {
                    ThamChieuDuLieu thamChieuDuLieu = new ThamChieuDuLieu();
                    thamChieuDuLieu.GiaTri = nhanVien.Oid;

                    SqlServerThamChieuDuLieu sqlServerThamChieuDuLieu = new SqlServerThamChieuDuLieu();
                    temp = sqlServerThamChieuDuLieu.Delete(thamChieuDuLieu);
                }
            }
            return temp;
        }


        public int Save(NhanVien obj)
        {
            throw new NotImplementedException();
        }
    }
}
